package cn.iocoder.yudao.module.bill.service.tag;

import cn.iocoder.yudao.framework.common.exception.ServerException;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;

import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import cn.iocoder.yudao.module.bill.controller.admin.tag.vo.*;
import cn.iocoder.yudao.module.bill.dal.dataobject.tag.BillTagDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.bill.dal.mysql.tag.BillTagMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bill.enums.ErrorCodeConstants.*;

/**
 * 账单标签 Service 实现类
 *
 * @author mmciel
 */
@Service
@Validated
public class BillTagServiceImpl implements BillTagService {

    @Resource
    private BillTagMapper tagMapper;

    @Override
    public Long createTag(BillTagSaveReqVO createReqVO) {
        // 校验name是否重复
        BillTagDO tagDO = this.checkRepeated(createReqVO.getTag());
        if (tagDO != null) {
            throw exception(TAG_EXISTS);
        }
        // 插入
        BillTagDO tag = BeanUtils.toBean(createReqVO, BillTagDO.class);
        tagMapper.insert(tag);
        // 返回
        return tag.getId();
    }

    private BillTagDO checkRepeated(@NotEmpty(message = "标签名不能为空") String tag) {
        LambdaQueryWrapperX<BillTagDO> wrapperX = new LambdaQueryWrapperX<>();
        wrapperX.eq(BillTagDO::getTag, tag);
        List<BillTagDO> billTagDOS = tagMapper.selectList(wrapperX);
        if (!billTagDOS.isEmpty()) {
            return billTagDOS.get(0);
        }
        return null;
    }

    @Override
    public void updateTag(BillTagSaveReqVO updateReqVO) {
        // 校验name是否重复
        BillTagDO tagDO = this.checkRepeated(updateReqVO.getTag());
        if (tagDO != null) {
            throw exception(TAG_EXISTS);
        }

        // 校验存在
        validateTagExists(updateReqVO.getId());
        // 更新
        BillTagDO updateObj = BeanUtils.toBean(updateReqVO, BillTagDO.class);
        tagMapper.updateById(updateObj);
    }

    @Override
    public void deleteTag(Long id) {
        // 校验存在
        validateTagExists(id);
        // 删除
        tagMapper.deleteById(id);
    }

    private void validateTagExists(Long id) {
        if (tagMapper.selectById(id) == null) {
            throw exception(TAG_NOT_EXISTS);
        }
    }

    @Override
    public BillTagDO getTag(Long id) {
        return tagMapper.selectById(id);
    }

    @Override
    public PageResult<BillTagDO> getTagPage(BillTagPageReqVO pageReqVO) {
        return tagMapper.selectPage(pageReqVO);
    }

}